﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using grupo2DEWStudio7i.Persistencia;
using grupo2DEWStudio7i.Dominio;

namespace grupo2DEWStudio7i.Pruebas
{
    [TestFixture]
    public class TestLocalDAO
    {
        // Atributos a utilizar durante las pruebas
        private ILocalDAO localDAO = null;
        private int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // 1. Definimos la implementación del DAO a probar (ADO / NH / EF)
            localDAO = new Persistencia.ADO.LocalDAO();
            // 2. Eliminamos todas las salas en BD antes de eliminar los locales
            ISalaDAO salaDAO = new Persistencia.ADO.SalaDAO();
            foreach (Sala sala in salaDAO.ListarTodos())
                salaDAO.Eliminar(sala);
            // 3. Eliminamos todos los locales en BD antes de las pruebas
            foreach (Local local in localDAO.ListarTodos())
                localDAO.Eliminar(local);
            // 4. Creamos 2 locales para tenerlos disponibles en las pruebas
            localDAO.Crear(new Local() { Nombre = "Monterrico", Direccion = "Av. Primavera 123" });
            localDAO.Crear(new Local() { Nombre = "Los Olivos", Direccion = "Av. Las Palmeras 456" });
        }
        [Test]
        public void Test1_Crear()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Local localACrear = new Local();
            localACrear.Nombre = "San Miguel";
            localACrear.Direccion = "Colegio Claretiano 789";
            // 3. Declaramos la entidad que contendrá el resultado
            Local localCreado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localCreado = localDAO.Crear(localACrear);
                codigoGenerado = localCreado.Codigo;
            }, "local creado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localCreado);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(localCreado.Codigo, 0);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(localCreado.Nombre, localACrear.Nombre);
            // Probamos que la dirección registrada es igual a la solicitada con la entidad
            Assert.AreEqual(localCreado.Direccion, localACrear.Direccion);
        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Definimos los datos para la prueba
            int codigo = codigoGenerado;
            // 3. Declaramos la entidad que contendrá el resultado
            Local localObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localObtenido = localDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localObtenido);
            Assert.AreEqual(localObtenido.Codigo, codigo);
            Assert.IsNotNullOrEmpty(localObtenido.Nombre);
            Assert.IsNotNullOrEmpty(localObtenido.Direccion);
        }
        [Test]
        public void Test3_Modificar()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Local localAModificar = localDAO.Obtener(codigoGenerado);
            localAModificar.Nombre = "San Miguel 2";
            localAModificar.Direccion = "Av. Parque de Las Leyendas 555";
            // 3. Declaramos la entidad que contendrá el resultado
            Local localModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localModificado = localDAO.Modificar(localAModificar);
            }, "local modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(localModificado.Codigo, codigoGenerado);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(localModificado.Nombre, localAModificar.Nombre);
            // Probamos que la dirección registrada es igual a la solicitada con la entidad
            Assert.AreEqual(localModificado.Direccion, localAModificar.Direccion);
        }
        [Test]
        public void Test4_Eliminar()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Definimos la entidad que contendrá el resultado
            Local localExistente = localDAO.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localDAO.Eliminar(localExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(localDAO.Obtener(codigoGenerado));
        }
        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Local> localesEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localesEncontrados = localDAO.ListarTodos();
            }, "local eliminado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localesEncontrados);
            // Probamos que la cantidad de locales encontrados sea 2
            Assert.AreEqual(localesEncontrados.Count, 2);
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Local localEncontrado in localesEncontrados)
            {
                Assert.IsNotNull(localEncontrado);
                Assert.IsInstanceOf(typeof(Local), localEncontrado);
            }
        }
        [Test]
        public void Test6_ListarXNombre()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Definimos los datos para la prueba
            string busqueda = "ter"; // Monterrico
            // 3. Declaramos la entidad que contendrá el resultado
            ICollection<Local> localesEncontrados = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localesEncontrados = localDAO.ListarXNombre(busqueda);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localesEncontrados);
            // Probamos que la cantidad de locales encontrados sea 2
            Assert.AreEqual(localesEncontrados.Count, 1);
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Local localEncontrado in localesEncontrados)
            {
                Assert.IsTrue(localEncontrado.Nombre.Contains(busqueda));
            }
        }
        //[TestFixtureTearDown]
        //public void TerminarPruebas()
        //{
        //    //NHibernateHelper.CerrarFabrica();
        //}
    }


}